package com.atguigu.springcloud.service;

import cn.hutool.core.util.IdUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.concurrent.TimeUnit;

@Service
public class PaymentService {
	public String paymentInfo_OK(Integer id) {
		return "线程池： " + Thread.currentThread().getName() + " paymentinfo_OK, id: " + id;
	}

	@HystrixCommand(fallbackMethod ="paymentInfo_TIMEOUTHandler", commandProperties = {
			@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
	})
	public String paymentInfo_TIMEOUT(Integer id) {
		int timeNumber = 3;
		try {
			TimeUnit.SECONDS.sleep(timeNumber);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "线程池： " + Thread.currentThread().getName() + " paymentInfo_TIMEOUT, id: " + id + " 耗时： " + timeNumber + "秒 ";
	}

	public String paymentInfo_TIMEOUTHandler(@PathVariable("id") Integer id) {
		return "线程池： " + Thread.currentThread().getName() + " paymentInfo_TIMEOUT, 服务降级";
	}

	// 服务熔断
	@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = {
			@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 是否开启断路器
			@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), // 请求次数
			@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期
			@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") // 失败率达到多少跳闸
	})
	public String pyamentCircuitBreaker(@PathVariable("id") Integer id) {
		if (id < 0) {
			throw new RuntimeException("**********id 不能为负数");
		}
		String serialNumer = IdUtil.simpleUUID();
		return "线程池： " + Thread.currentThread().getName() + " pyamentCircuitBreaker, id: " + serialNumer;
	}
	public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {
		return "id 不能负数，请稍后再试， id: " + id;
	}
}

